/**
 * 懒汉模式
 * 用到对象的时候再创建, 没有那么急切
 */
public class SingletonLazy1 {

    // 先不初始化, 用到的时候在创建
    private static SingletonLazy1 singletonLazy1 = null;

    private SingletonLazy1() {

    }

    // 提供一个获取对象的方法
    public static SingletonLazy1 getInstance() {

        // 对象为 null 的话创建一个
        if (singletonLazy1 == null) {
            singletonLazy1 = new SingletonLazy1();
        }
        return singletonLazy1;
    }

    // 在多线程下是可能会出现问题的
    // 这是因为我们在 判断 singletonLazy1 == null 时没有保证线程安全....
    public static void main(String[] args) {
        for (int i = 0; i < 20; i++) {
            Thread thread = new Thread(() -> {
                SingletonLazy1 singletonLazy1 = SingletonLazy1.getInstance();
                System.out.println(singletonLazy1);
            });
            thread.start();
        }
        /**
         * SingletonLazy@3c249937
         * SingletonLazy@4cdac883
         * SingletonLazy@4cdac883
         * SingletonLazy@4cdac883
         * ....
         */
    }

    // 在单线程下肯定是没有问题的
    public static void main1(String[] args) {
        // 获取第一个实例
        SingletonLazy1 s1 = SingletonLazy1.getInstance();
        System.out.println(s1.getInstance());
        // 获取二个实例
        SingletonLazy1 s2 = SingletonLazy1.getInstance();
        System.out.println(s2.getInstance());
        // 获取第三个实例
        SingletonLazy1 s3 = SingletonLazy1.getInstance();
        System.out.println(s3.getInstance());

        /**
         * SingletonHungry@3b07d329
         * SingletonHungry@3b07d329
         * SingletonHungry@3b07d329
         */
    }
}
